﻿using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Wordprocessing;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OpenXmlTools.OpenXML.Word
{
    /// <summary>
    /// 字体设置配置类 - 用于定义Word文档中文字的字体属性
    /// </summary>
    public class FontSettings
    {
        /// <summary>
        /// 设置东亚字符字体名称（中、日、韩等）
        /// 示例："微软雅黑"、"宋体"、"楷体"
        /// 注意：系统需安装指定字体才能正确显示
        /// </summary>
        public string EastAsianFont { get; set; } = "宋体";

        /// <summary>
        /// 设置ASCII字符字体名称（英文字母、数字等）
        /// 示例："Arial"、"Times New Roman"
        /// 当文档包含混合文字时，建议与EastAsianFont搭配使用
        /// </summary>
        public string AsciiFont { get; set; } = "Arial";

        /// <summary>
        /// 设置字号大小（使用半号单位，half-points）
        /// 常规字号对应关系：
        ///   11号字 = 22 (默认值)
        ///   12号字 = 24
        ///   14号字 = 28
        ///   16号字 = 32
        /// 注意：OpenXML使用半号单位，实际字号 = 设定值 / 2
        /// </summary>
        public int FontSize { get; set; } = 22; // 对应11号字

        /// <summary>
        /// 设置文字颜色（使用6字符HEX值，不含#前缀）
        /// 示例：红色 = "FF0000", 蓝色 = "0000FF", 黑色 = "000000"
        /// 格式：RRGGBB（红色、绿色、蓝色分量）
        /// </summary>
        public string ColorHex { get; set; } = "000000"; // 黑色

        /// <summary>
        /// 设置是否启用粗体
        /// 设置为true启用粗体，false为普通文本
        /// 等效于Word中的"加粗"按钮
        /// </summary>
        public bool Bold { get; set; } = false;

        /// <summary>
        /// 设置是否启用斜体
        /// 设置为true启用斜体，false为普通文本
        /// 等效于Word中的"倾斜"按钮
        /// </summary>
        public bool Italic { get; set; } = false;

        /// <summary>
        /// 设置是否添加单下划线
        /// 设置为true添加单下划线，false无下划线
        /// 等效于Word中的"下划线"按钮
        /// 如需其他下划线样式，可扩展此属性
        /// </summary>
        public bool Underline { get; set; } = false;

        /// <summary>
        /// 设置是否添加删除线（文字中部横线）
        /// 设置为true启用删除线，false无删除线
        /// 等效于Word中的"删除线"按钮
        /// OpenXML 中使用 "Strike" 元素表示删除线
        /// </summary>
        public bool Strikethrough { get; set; } = false;

        /// <summary>
        /// 将当前设置应用到OpenXML运行属性(RunProperties)
        /// </summary>
        /// <param name="rPr">目标RunProperties对象</param>
        public void ApplyTo(RunProperties rPr)
        {
            // 移除现有字体属性，避免样式冲突
            RemoveExistingProperties(rPr);

            // 设置新字体属性
            rPr.Append(new RunFonts
            {
                EastAsia = EastAsianFont,
                Ascii = AsciiFont,
                HighAnsi = AsciiFont // 高ANSI字符（符号等）使用ASCII字体
            });

            // 设置字号
            rPr.Append(new FontSize { Val = FontSize.ToString() });

            // 设置颜色
            rPr.Append(new Color { Val = ColorHex });

            // 设置样式
            if (Bold)
            {
                rPr.Append(new Bold());
            }
            if (Italic)
            {
                rPr.Append(new Italic());
            }
            if (Underline)
            {
                rPr.Append(new Underline { Val = UnderlineValues.Single });
            }
            if (Strikethrough)
            {
                rPr.Append(new Strike());
            }
        }

        /// <summary>
        /// 清空现有字体属性，准备应用新样式
        /// </summary>
        private void RemoveExistingProperties(RunProperties rPr)
        {
            // 获取当前所有属性
            var existingProps = rPr.Elements<OpenXmlElement>().ToList();

            // 移除所有属性
            foreach (var prop in existingProps)
            {
                prop.Remove();
            }
        }
    }
}
